package medOffice;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Classe que contem verificadores de validade.
 * Verificadores de Strings ( cpf, endereco, nome, telefone, email e tempo )
 * 
 * @author Ana Clara Lacerda - anacls@lcc.ufcg.edu.br
 * @version 0.2 - 02/12/2009
 */
public class Verificador {


	/**
	 * Verifica se o cpf esta na forma: ddddddddd-dd , onde d é um digito de 0-9
	 * 
	 * @param String cpf
	 * @return boolean true caso seja valido, false caso contrario
	 */
	public static boolean verificaCpf(String cpf) {
		if (cpf == null || cpf.equals("")) {
			return false;
		}
		Pattern padrao = Pattern.compile("\\d+\\-\\d\\d");
		Matcher pesquisa = padrao.matcher(cpf);
		return (pesquisa.matches() && (cpf.toCharArray().length == 12)) ? true
				: false;
	}

	/**
	 * Verifica se o endereco e null ou vazio
	 * 
	 * @param String endereco
	 * @return boolean true caso seja valido, false caso contrario
	 */
	public static boolean verificaEndereco(String endereco) {
		if (endereco == null)
			return false;
		return true;
	}

	/**
	 * Verifica se o nome e valido, ou seja, contem letras e/ou espacos em
	 * branco
	 * 
	 * @param String nome
	 * @return boolean true caso seja valido, false caso contrario
	 */
	public static boolean verificaNome(String nome) {
		if (nome != null && !nome.equals("") && nome.matches("\\D+"))
            return true;
        return false;		
	}

	/**
	 * Verifica de o telefone esta na forma: (dd) dddd-dddd , sendo d um digito
	 * de 0-9
	 * 
	 * @param String telefone
	 * @return boolean true caso seja valido, false caso contrario
	 */
	public static boolean verificaTelefone(String telefone) {
		if (telefone == null)
			return false;
		if (telefone.equals(""))
			return true;
		Pattern padrao = Pattern
				.compile("\\(\\d\\d\\)\\s\\d\\d\\d\\d\\-\\d\\d\\d\\d");
		Matcher pesquisa = padrao.matcher(telefone);
		return (pesquisa.matches() && telefone.toCharArray().length == 14) ? true
				: false;
	}

	/**
	 * Verifica se o email esta na forma: usuario@nome.nome
	 * 
	 * @param String email
	 * @return boolean true caso seja valido, false caso contrario
	 */
	public static boolean verificaEmail(String email) {
		if (email==null)
			return false;
		if (email.equals(""))
			return true;
		Pattern padrao = Pattern.compile(".+@[a-z]+\\.\\D+");
		Matcher pesquisa = padrao.matcher(email);
		return (pesquisa.matches());
	}

	/**
	 * Verifica se o tempo esta na forma: hh:mm:ss
	 * 
	 * @param String tempo
	 * @return boolean true caso seja valido, false caso contrario
	 */
	public static boolean verificaTempo(String tempo) {
		if (tempo == null || tempo.equals(""))
			return false;
		Pattern padrao = Pattern.compile("\\d\\d\\:\\d\\d:\\d\\d");
		Matcher pesquisa = padrao.matcher(tempo);
		return (pesquisa.matches());
	}

	// Verificadores de Objetos ( Calendar, PlanoDeSaude )

	/**
	 * Verifica se a data de nascimento e valida, ou seja, nao eh uma data do
	 * futuro.
	 * 
	 * @param Calendar data
	 * @return boolean true caso seja valida, false caso contrario
	 */
	public static boolean verificaDataPassada(Calendar data) {
		Calendar diaAtual = new GregorianCalendar();
		return (data == null || data.after(diaAtual) || data.equals(diaAtual)) ? false
				: true;
	}
	
	/**
	 * Metodo que verifica se uma data qualquer esta no futuro ou esta no dia presente.
	 * @param Calendar data
	 * @return boolean true caso seja futuro, false caso contrario.
	 */
	public static boolean verificaDataFutura(Calendar data) {
		Calendar diaAtual = new GregorianCalendar();
		return (data == null || data.before(diaAtual)) ? false
				: true;
	}

	/**
	 * Verifica se um Plano de Saude ja foi adicionado a um certo Medico
	 * 
	 * @param Medico
	 *             medico especifico
	 * @param PlanoDeSaude
	 *             plano de saude que vai ser verificado
	 * @return boolean true caso o medico nao contenha o plano de saude, false caso
	 *         contrario
	 */
	public static boolean verificaPlanoDeSaude(Medico m, PlanoDeSaude p) {
		if (p == null || m.getPlanosDeSaude().contains(p))
			return false;
		return true;

	}

	// Verificadores de valores ( int )

	/**
	 * Verifica se um numero esta entre um minimo e um maximo dados (incluindo o
	 * minimo e o maximo)
	 * 
	 * @param int
	 *            numero a ser verificado
	 * @param int
	 *            maximo possivel (incluindo o proprio maximo)
	 * @param int
	 *            minimo possivel (incluindo o proprio minimo)
	 * @return boolean true caso esteja entre o minimo e o maximo, false caso contrario
	 */
	public static boolean verificaInteiroEntre(int inteiro, int maximo, int minimo) {
		return (inteiro >= minimo && inteiro <= maximo) ? true : false;
	}
	
	/**
	 * Verifica a validade de configuracao de uma data.
	 * @param String data
	 * @return boolean verdadeiro caso positivo, false caso negativo.
	 */
	public static boolean verificaData(String data) {
		if (data != null && data.matches("\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d")) {
			return true;
		}
		return false;
	}

}
